import type { ComponentLibrary } from "@/plugin/componentsLib/types.ts";
import type { OfficialPlugin } from "@/plugin/official-plugin/types.ts";
import windowInterceptor from "@/plugin/_plugin_methods/interceptor/window.ts";
import { componentsLibMap } from "@/plugin/componentsLib";
import { officialPluginMap } from "@/plugin/official-plugin";
import { useSyncHashWithRouter } from "./router";
/**
 * 插件配置选项接口。
 */
export interface Options {
  /**
   * 要注册的组件库数组。
   * 每个数组项应该是一个 Vue 组件库的类型。
   * 例如，可以是 AntdVue 或 ElementPlus 等。
   *
   * @type {Array} - 数组中的每个项都是一个组件库的类型。
   * @see {@link https://3x.antdv.com/components/form-cn}  - AntdVue 的文档地址。<br>
   * @see {@link https://element-plus.org/zh-CN/guide/installation.html}  - ElementPlus 的文档地址。
   */
  componentsLib: ComponentLibrary[];

  /**
   * 工具函数或对象的集合。
   * 对象的键是字符串，表示工具名称；值是函数或对象。
   *
   * @type {object} - 键是字符串，值是任意类型。
   * @see {@link https://www.example.com/docs/utils} - 工具函数的文档地址。
   */
  utils: { [x: string]: any };

  /**
   * 官方的插件
   *
   * @type {Array} - 键是字符串，值是任意类型。
   * @see {@link https://pinia.vuejs.org/zh/introduction.html} - pinia的文档地址。<br>
   * @see {@link https://router.vuejs.org/zh/guide/} - vuerouter的文档地址。<br>
   */
  officialPlugins: OfficialPlugin[];
}

export default function handleOptions(app, options: Options) {
  windowInterceptor(options);

  const officialPlugins = options?.officialPlugins;
  officialPlugins.forEach((plugin) => {
    app.use(officialPluginMap[plugin]);
  });

  const componentsLib = options?.componentsLib;
  componentsLib.forEach((component) => {
    app.use(componentsLibMap[component]);
  });
  // 图标库
  for (const [key, component] of Object.entries(
    componentsLibMap.ElementPlusIconsVue
  )) {
    app.component(key, component);
  }

  const utils = options?.utils;
  window.cjs = {};
  if (utils) {
    Object.keys(utils).forEach((key) => {
      window.cjs[key] = utils[key];
      app.config.globalProperties[key] = utils[key];
    });
  }

  useSyncHashWithRouter();
}
